﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

using Noris.Tools.TraceVisualiser.Support;

namespace Noris.Tools.TraceVisualiser.Components
{
    #region CLASS GridIDataRowCls : jeden řádek grafu, jeho logická data
    /// <summary>
    /// GridIDataRowCls : jeden řádek grafu, jeho logická data
    /// Tato třída se používá pro založení temporary řádku do seznamu dat, a to pouze po dobu načítání reálných dat z datového zdroje.
    /// Po načtení dat je tento element ze seznamu řádků odebrán.
    /// Tato třída tedy poskytuje základní implementaci IDataRow,
	/// </summary>
    internal class GridIDataRowCls : IDataRow
    {
        #region Konstrukce
        /// <summary>
        /// Může obsahovat text do sloupce, který bude vracet metoda GetColumnContent().
        /// </summary>
        public string ColumnText;
        /// <summary>
        /// Může obsahovat rozšiřující text, který bude vracet metoda ToolTipInfo().
        /// </summary>
        public string TextNote;
        #endregion
        #region IDataRow Members
        public GID GId { get; set; }
        public string NodeName { get; set; }
        public bool HasSubNodes { get; set; }
        public RowGraphMode RowGraph { get; set; }
        public float RowHeightMultiplier { get; set; }
        public GID ParentGId { get; set; }
        public GID NextGId { get; set; }
        public List<IDataElement> ElementList { get; set; }
        public TimeRange ElementLoadedTimeRange { get; set; }
        public bool AllElementsLoaded { get; set; }
        public RowActionType ActionOnRowDoubleClick { get; set; }
        public RowActionType ActionOnElementDoubleClick { get; set; }
		public bool ShowPrevNextIcon { get; set; }
		public bool ReloadSubNodesOnExpandNode { get; set; }
        public Image Icon { get; set; }
		public ContentAlignment IconAlignment { get; set; }
        public Color RowColor { get; set; }
		/// <summary>
		/// Nejmenší výška řádku grafu, v pixelech.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightTotalMinPx { get; set; }
		/// <summary>
		/// Nejvyšší výška řádku grafu, v pixelech.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightTotalMaxPx { get; set; }
		/// <summary>
		/// Typická výška jedné linky řádku (linka v MultiThread grafu odpovídá výšce jednoho elementu s UseRatio = 1.0M), u ostatních grafů jde o běžnou výšku elementu.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightLineSolidPx { get; set; }
		/// <summary>
		/// Typická výška jednoho řádku, pokud jde o řádek typu RowGraphMode.MultiTask, kde elementy mají UseRatio různé od 1.0M
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightLineFragmentPx { get; set; }
		/// <summary>
		/// Výška nejmenšího zlomku v grafu typu RowGraphMode.MultiTask, kdy jsou zobrazeny položky využívající podíl kapacity.
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public int? RowHeightMinFragmentPx { get; set; }
		/// <summary> { get; }
		/// Přídavek k výšce neděleného řádku, vyjádřený relativně k hodnotě this.RowHeightLineSolidPx (fyzická výška jedné nedělené linky).
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public decimal? RowHeightAddLineSolidRatio { get; set; }
		/// <summary> { get; }
		/// Přídavek k výšce děleného řádku, vyjádřený relativně k hodnotě this.RowHeightLineFragmentPx (fyzická výška jedné dělené linky).
		/// Pokud nebude zadáno, převezme se z deklarace grafu.
		/// </summary>
		public decimal? RowHeightAddLineFragmentRatio { get; set; }
        public string GetColumnContent(int index, string key)
        {
            return this.ColumnText;
        }
        public string GetColumnValue(int index, string key)
        {
            return null;
        }
        public string ToolTipInfo()
        {
            return this.TextNote;
        }
        #endregion
        #region Public static construtor
        /// <summary>
        /// Vytvoří a vrátí Temporary element na základě požadavku na načítání dat.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static GridIDataRowCls CreateTempRow(DataRequestReadRows request)
        {
            GridIDataRowCls row = new GridIDataRowCls()
            {
                GId = request.RequestGId,
                HasSubNodes = false,
                RowGraph = RowGraphMode.SingleTask,           /* Budou se kreslit elementy, element bude typicky jeden přes celý řádek (FullRow) */
				RowHeightAddLineSolidRatio = 0M,
                RowHeightLineSolidPx = 23,
                ParentGId = request.ParentRowGid,
                AllElementsLoaded = true,
                ActionOnRowDoubleClick = RowActionType.None,
                ActionOnElementDoubleClick = RowActionType.None
            };
            return row;
        }
        #endregion
    }
    #endregion
    #region CLASS GridIDataElementCls : jeden prvek grafu, jeho logická data
    /// <summary>
    /// GridIDataElementCls : jeden prvek grafu, jeho logická data.
    /// Tato třída se používá pro založení temporary elementu do řádku grafu, a to pouze po dobu načítání reálných dat z datového zdroje.
    /// Po načtení dat je tento element z řádku odebrán.
    /// Tato třída tedy poskytuje základní implementaci IDataElement
	/// Jedna položka, která popisuje jednu položku grafu.
	/// Obsahuje informaci o parent GID = řádek, do něhož patří, obsahuje svůj GID = specifikuje svoji třídu, 
	/// obsahuje časový úsek v rámci grafu a další informace o způsobu využití uvedeného času.
	/// Neobsahuje nic grafického ve smyslu rozměrů, pozice, barvy, ikony atd.
	/// </summary>
	internal class GridIDataElementCls : IDataElement
    {
        #region Konstrukce
        /// <summary>
        /// Může obsahovat rozšiřující text, který bude vracet metoda ToolTip.
        /// </summary>
        public string TextNote;
        #endregion
        #region IDataElement
        public bool ElementVisible { get; set; }
        public GID GId { get; set; }
        public GID RowGId { get; set; }
        public TimeRange TimeRange { get; set; }
		public float ElementHeightRatio { get; set; }
		public bool BeginIsUncertain { get; set; }
        public bool EndIsUncertain { get; set; }
		public int SubTimeSort { get; set; }
		public bool FullRow { get; set; }
        public bool HideZeroWidthElementRectangle { get; set; }
		public float[] Fragments { get; set; }
        public GraphLayerType ElementLayer { get; set; }
        public int ElementGroup { get; set; }
        public GraphElementShapeType ElementShapeType { get; set; }
        public ElementProperties Properties { get; set; }
        public ElementActionType ActionOnDoubleClick { get { return ElementActionType.DefaultByRow; } }
        public GraphElementHandler DoubleClick { get; set; }
        public string ColorGroup { get; set; }
        public Color BackColor { get; set; }
        public Color FontColor { get; set; }
        public bool CaptionShowAllways { get; set; }
		public Image ElementImage { get; set; }
		public ContentAlignment ImagePivotElementPoint { get; set; }
		public ContentAlignment ImagePivotImagePoint { get; set; }
        public string ToolTipInfo
        {
            get
            {
                string result = "Čas " + this.TimeRange.ToString();
                // TextNote:
                if (this.TextNote != null)
                    result += Environment.NewLine + this.TextNote.Replace(Environment.NewLine, Environment.NewLine + "    ");
                return result;
            }
        }
		public string GetToolTipInfo(IDataRow rowData)
        {
            return null;
        }
        public string[] Captions
        {
            get { return null; }
        }
        public string GetCaption(IDataRow rowData, float charCount)
        {
            return null;
        }
        public void DrawElement(GraphElementPainterArgs args)
        {
        }
        #endregion
        #region Public static construtor
        /// <summary>
        /// Vytvoří a vrátí Temporary element na základě požadavku na načítání dat elementů pro daný čas.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static GridIDataElementCls CreateTempElement(DataRequestReadElementsForRows request)
        {
            GridIDataElementCls element = new GridIDataElementCls()
            {
                ElementLayer = GraphLayerType.ElementTempLayer,
                GId = request.RequestGId,
                RowGId = request.RowGid,
                TimeRange = request.TimeRange
            };
            return element;
        }
        /// <summary>
        /// Vytvoří a vrátí Temporary element na základě požadavku na načítání dat podřízených řádků.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
		public static GridIDataElementCls CreateTempElement(DataRequestReadRows request)
        {
            GridIDataElementCls element = new GridIDataElementCls()
            {
                ElementLayer = GraphLayerType.ElementTempLayer,
                GId = request.RequestGId,
				RowGId = request.RequestGId,
				FullRow = true
            };
            return element;
        }
        #endregion
    }
	#endregion
}
